﻿#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>



//调试时显示内存，左边就是低地址，右边就是高地址
//一个数据从右往左，是低字节到高字节，比如0x11223344，右边44就是低字节

//⼤端（存储）模式：是指数据的低位字节内容保存在内存的⾼地址处，⽽数据的⾼位字节内容，保存
//在内存的低地址处。
//⼩端（存储）模式：是指数据的低位字节内容保存在内存的低地址处，⽽数据的⾼位字节内容，保存
//在内存的⾼地址处。


//int main()
//{
//	//char a[5] = { 'a','dd','xs' };
//
//	int a = 0;
//	(char)a = 0x11223344;//这里0x44是低字节，0x11是高字节
//	printf("%x", a);//打印的是44，明显数据低字节内容保存在内存的低地址处，是小端存储
//
//	return 0;
//}
//判断系统是大（小）端字节存储
//int main()
//{
//	int a = 0x11223301;
//	if ((char)a == 1)
//		printf("小端字节\n");
//	else
//		printf("大端字节\n");
//	return 0;
//}
//int check_sys()
//{
//	int n = 1;
//	return *(char*)&n;
//}
//int main()
//{
//	if (check_sys())
//		printf("小端字节\n");
//	else
//		printf("大端字节\n");
//	return 0;
//}


//M1
//int main()
//{
//	char a = -1;
//	//原码10000000000000000000000000000001
//	//补码11111111111111111111111111111111
//	//a - 11111111 
//	//补码11111111111111111111111111111111（整型提升）
//	//原码11111111111111111111111111111111
//	signed char b = -1;
//	//b - 11111111
//	//同上
//	unsigned char c = -1;
//	//c - 11111111
//	//补码00000000000000000000000011111111
//	//原码00000000000000000000000011111111 256-1=255
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	return 0;
//}


//M2
//int main()
//{
//	char a = -128;
//	//原码10000000000000000000000010000000
//	//补码11111111111111111111111110000000
//	//a - 10000000
//	//补码11111111111111111111111110000000(直接当做无符号型)
//	//原码11111111111111111111111110000000(直接拿来当原码)
//	//（2^32-1）-（2^7-1）= 2^32-2^7
//	printf("%u\n", a);//%u打印无符号型数
//	char b = 128;
//	printf("%u\n", b);
//
//	return 0;
//}


//M3
//int main()
//{
//	char a[1000];//char类型
//	//-128~127
//	//00000000 - 0
//	//……
//	//01111111 - 127
//	//10000000 - -128
//	//……
//	//11111111 - -127
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d\n", strlen(a));
//
//	//char b = 128;
//	////原码10000000
//	////补码同上
//	//printf("%d\n", b);
//	//印证一下	
//
//	return 0;
//}//


//M4
//void test1()
//{
//	unsigned char i = 0;//unsigned char类型
//	//0~255
//	//00000000 - 0
//	//……
//	//10000000 - 128
//	//……
//	//11111111 - 255
//	for (i = 0; i <= 255; i++)//当i=255时成立，i++后为0从新循环
//	{
//		printf("hello world\n");
//	}
//}
//void test2()
//{
//	unsigned int i;//0 ~ 2^33-1
//	for (i = 9; i >= 0; i--)//i=时成立，-1后为2^33-1继续循环
//	{
//		printf("%u\n", i);
//	}
//}
//int main()
//{
//	//test1();
//	test2();
//	return 0;
//}


//M5
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//
//	int* ptr1 = (int*)(&a + 1);//&a+1跳过整个数组
//	//*(ptr1-1)=a[4]=4
//	//0x00000004
//
//	int* ptr2 = (int*)((int)a + 1);//整数+1，字节+1，
//	//a[4]存储01 00 00 00;02 00 00 00;03 00 00 00;04 00 00 00
//	//取00 00 00 02
//	//0x02000000
//
//	printf("%#x,%#x", ptr1[-1], *ptr2);//当然打印的时候前面的0省略了
//	//结果为0x4,0x2000000
//	//在x86环境下小端字节排序，可以打印
//
//	return 0;
//}



//浮点数在内存中的存储
//int main()
//{
//	int n = 9;//整型，储存以整型的存储规则
//	//补码00000000 00000000 00000000 00001001
//	float* pFloat = (float*)&n;
//	printf("n的值为：%d\n", n);//%d打印整型，正常打印9
//	printf("*pFloat的值为：%f\n", *pFloat);//%f以浮点数的形式打印，使用浮点数的读取规则
//	//S=0,E=0000000 0,M=0000000 00000000 00001001,E=1-127=-126
//	//V=(-1)^0    *   0.0000000 00000000 00001001*2^(-126)
//	//很小，所以打印值为0
//
//
//
//	*pFloat = 9.0;//*pFloat是浮点数，以浮点数的存储规则进行存储
//	//(-1)^0 * 1.001 * 2^3
//	//S=0,E=3+127=130,M=1.001
//	//0100 0001 0001 0000 0000 0000 0000 0000 (2进制)
//	//41 10 00 00 (16进制)
//	//00 00 10 41 (内存中的储存形式，小端字节排序)
//	printf("num的值为：%d\n", n);//%d打印整型，以整型的读取规则进行读取
//	//2^20+2^24+2^30=1,091,567,616
//	printf("*pFloat的值为：%f\n", *pFloat);//正常打印
//
//
//	//总结，要注意 储存和读取 上的不同，以整形的形式存放、以浮点数的形式读取就会出现意想不到的数值
//	return 0;
//}
